home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mtwindow.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  16.9 KB  |  564 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE mtWindows;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *-----------+----------+------+----------------------------------------*)
  29.  
  30.  
  31.  
  32. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  33. (*                                              *)
  34. (*$R-   Range-Checks                            *)
  35. (*$S-   Stack-Check                             *)
  36. (*                                              *)
  37. (*----------------------------------------------*)
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  45.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  46.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  47.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  48.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  49.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  50.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  51.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  61.  
  62.  
  63.  
  64.  
  65. FROM SYSTEM     IMPORT  ADDRESS, ADR, TSIZE;
  66. FROM MagicAES   IMPORT  AESIntIn, AESCall, AESIntOut, VSLIDE, HSLIDE, 
  67.                         NAME, INFO, WindGet, WindSet, WFNAME, WFINFO,
  68.                         WFWORKXYWH, WFCURRXYWH, WFPREVXYWH, WFFULLXYWH,
  69.                         WFHSLIDE, WFVSLIDE, WFTOP, WFFIRSTXYWH, WFNEXTXYWH,
  70.                         WFNEWDESK, WFHSLSIZE, WFVSLSIZE, WFSCREEN, WFATTRIB,
  71.                         WFSIZTOP, GrafGrowbox, GrafShrinkbox, FormAlert,
  72.                         WindOpen, WindClose, WindDelete, WindCreate;
  73. FROM mtTerminal IMPORT  TERMINAL, CloseTerminal, ChangeTerminal, GetTerminal,
  74.                         SetTerminal, GetMaximum, RedrawTerminal, ClipRect,
  75.                         CurrWidth, CurrHeight;
  76. FROM MagicStrings  IMPORT  Assign;
  77. FROM mtUtils    IMPORT  tRect, Min, Max;
  78.                 IMPORT  MagicAES, mtAppl;
  79.  
  80.  
  81. CONST   cMaxWin =       256;    (* Maximal 0..256 Fenster *)
  82.  
  83. CONST   cOpen =         0;      (* Fensterzustandflags  *)
  84.         cTerminal =     1;
  85.         cGraphic =      2;
  86.         cFulled =       3;
  87.  
  88. CONST   FrameRect =     0;
  89.         WorkRect =      1;
  90.  
  91.  
  92. TYPE    WINDOW =    POINTER TO Window;
  93.         Window =    RECORD
  94.                      handle:    sINTEGER;       (* AES-Handle               *)
  95.                      area:      tRect;          (* Arbeitsbereich des Windows *)
  96.                      vslSize:   sCARDINAL;      (* Gr”že Vertical Slider    *)
  97.                      vslPos:    sCARDINAL;      (* Pos Vertical Slider      *)
  98.                      hslSize:   sCARDINAL;      (* Gr”že Horizontal Slider  *)
  99.                      hslPos:    sCARDINAL;      (* Pos Horizontal Slider    *)
  100.                      elements:  sBITSET;        (* Fensterelemente          *)
  101.                      zustand:   sBITSET;        (* Zustand-Flags            *)
  102.                      name:      ARRAY [0..255] OF CHAR;
  103.                      info:      ARRAY [0..255] OF CHAR;
  104.                      term:      TERMINAL;
  105.                      (* graph:     GRAPHIC; *)
  106.                      next:      WINDOW;
  107.                     END;
  108.  
  109.  
  110. VAR     windows:        WINDOW;
  111.         graphics:       BOOLEAN;
  112.         in2:            POINTER TO ADDRESS;
  113.         r1, r2, r3:     tRect;        
  114.         r:              POINTER TO tRect;
  115.         wx, wy, ww, wh: sINTEGER;
  116.         ws, wz:         sINTEGER;
  117.         minSize:        sINTEGER;
  118.         i:              sINTEGER;
  119.         tr:             RECORD
  120.                          adr:    ADDRESS;
  121.                          d1, d2: sINTEGER;
  122.                         END;
  123.  
  124. PROCEDURE Calc (what: sINTEGER; comp: sBITSET; in: tRect; VAR out: tRect);
  125. BEGIN
  126.  AESIntIn[ 0]:= what;
  127.  AESIntIn[ 1]:= CastToInt (comp);
  128.  AESIntIn[ 2]:= in.x;
  129.  AESIntIn[ 3]:= in.y;
  130.  AESIntIn[ 4]:= in.w;
  131.  AESIntIn[ 5]:= in.h;
  132.  i:= AESCall(108, 6, 5, 0, 0);
  133.  out.x:= AESIntOut[1];
  134.  out.y:= AESIntOut[2];
  135.  out.w:= AESIntOut[3];
  136.  out.h:= AESIntOut[4];
  137. END Calc;
  138.  
  139. PROCEDURE GetWindow (win: sINTEGER; VAR v: WINDOW): WINDOW;
  140. VAR p: WINDOW;
  141.     c: CARDINAL;
  142. BEGIN
  143.  p:= windows;  v:= NIL;
  144.  WHILE p # NIL DO
  145.   IF p^.handle = win THEN  RETURN p;  END;
  146.   v:= p;  p:= p^.next;
  147.  END;
  148.  RETURN NIL;
  149. END GetWindow;
  150.  
  151. PROCEDURE NewWindow (elements: sBITSET; REF name, info: ARRAY OF CHAR;
  152.                      VAR win: sINTEGER): BOOLEAN;
  153. VAR p, x1, x2:   WINDOW;
  154.     c:   CARDINAL;
  155. BEGIN
  156.  ALLOCATE (p,  TSIZE(Window));  
  157.  IF p = NIL THEN  RETURN FALSE;  END;
  158.  (* Erstmal ein Handle anfordern *)
  159.  WindGet (0, WFFULLXYWH, r3);
  160.  p^.handle:= WindCreate (elements, r3);
  161.  IF p^.handle < 0 THEN  DISPOSE (p);  RETURN FALSE;  END;
  162.  (* Anfangswerte eintragen *)
  163.  Calc (WorkRect, elements, r3, p^.area);
  164.  IF VSLIDE IN elements THEN  p^.vslSize:= 1000;  p^.vslPos:= 1;  END;
  165.  IF HSLIDE IN elements THEN  p^.hslSize:= 1000;  p^.hslPos:= 1;  END;
  166.  Assign (name, p^.name);
  167.  Assign (info, p^.info);
  168.  p^.elements:= elements;
  169.  p^.zustand:= {};
  170.  p^.term:= TERMINAL (NIL);
  171.  p^.next:= NIL;
  172.  (* In die Liste eintragen *)
  173.  IF windows = NIL THEN
  174.   windows:= p;
  175.  ELSE
  176.   x1:= windows;  x2:= windows;
  177.   WHILE x1 # NIL DO  x2:= x1;  x1:= x1^.next;  END;
  178.   x2^.next:= p;
  179.  END;
  180.  win:= p^.handle;
  181.  RETURN TRUE;
  182. END NewWindow;
  183.  
  184. PROCEDURE DeleteWindow (VAR win: sINTEGER);
  185. VAR p, v: WINDOW;
  186.     c: CARDINAL;
  187. BEGIN
  188.  p:= GetWindow (win, v);
  189.  IF p # NIL THEN
  190.   IF cOpen IN p^.zustand THEN  CloseWindow (p^.handle);  END; 
  191.   IF v # NIL THEN  v^.next:= p^.next;  ELSE  windows:= p^.next;  END;
  192.   DEALLOCATE (p, 0);
  193.  END;
  194.  AESIntIn[0]:= win;  i:= AESCall(103, 1, 1, 0, 0);
  195. END DeleteWindow;
  196.  
  197. PROCEDURE MaxWorkarea (win: sINTEGER; VAR rect: ARRAY OF LOC);
  198. VAR p, v: WINDOW;
  199. BEGIN
  200.  p:= GetWindow (win, v);  r:= ADR (rect);
  201.  WindGet (0, WFFULLXYWH, r3);
  202.  IF p # NIL THEN  Calc (WorkRect, p^.elements, r3, r^);
  203.             ELSE  Calc (WorkRect, {0..12}, r3, r^);
  204.  END;
  205. END MaxWorkarea;
  206.  
  207. PROCEDURE CalcWorkarea (win: sINTEGER; VAR rect: ARRAY OF LOC);
  208. VAR p, v: WINDOW;
  209. BEGIN
  210.  p:= GetWindow (win, v);  r:= ADR (rect);
  211.  IF p # NIL THEN  r^:= p^.area;
  212.             ELSE  WindGet (win, WFCURRXYWH, r3);
  213.  END;
  214. END CalcWorkarea;
  215.  
  216. PROCEDURE OpenWindow (win: sINTEGER; rect: ARRAY OF LOC);
  217. VAR p, v: WINDOW;
  218.     f: INTEGER;
  219.     fr, wr: tRect;
  220.     r: POINTER TO tRect;
  221. BEGIN
  222.  p:= GetWindow (win, v);  r:= ADR (rect);
  223.  IF p # NIL THEN
  224.   WITH p^ DO
  225.    IF cOpen IN zustand THEN  RETURN  END;
  226.    Calc (FrameRect, elements, r^, fr);
  227.    Calc (WorkRect, elements, fr, area);
  228.    IF graphics THEN
  229.     WindGet (0, WFFULLXYWH, r3);
  230.     r3.x:= r3.w DIV 2;  r3.y:= r3.h DIV 2;  r3.w:= 0;  r3.h:= 0;
  231.     r2:= area;
  232.     GrafGrowbox (r3, r2);
  233.    END;
  234.    IF VSLIDE IN elements THEN
  235.     r1.x:= vslPos;  r1.y:= 0; r1.w:= 0; r1.h:= 0; WindSet (handle, 9, r1);
  236.     r1.x:= vslSize; r1.y:= 0; r1.w:= 0; r1.h:= 0; WindSet (handle, 16, r1);
  237.    END;
  238.    IF HSLIDE IN elements THEN
  239.     r1.x:= hslPos;  r1.y:= 0; r1.w:= 0; r1.h:= 0; WindSet (handle, 8, r1);
  240.     r1.x:= hslSize; r1.y:= 0; r1.w:= 0; r1.h:= 0; WindSet (handle, 15, r1);
  241.    END;
  242.    IF NAME IN elements THEN
  243.     tr.adr:= ADR (name);  tr.d1:= 0;  tr.d2:= 0;  WindSet (handle, 2, tr);
  244.    END;
  245.    IF INFO IN elements THEN
  246.     tr.adr:= ADR (info);  tr.d1:= 0;  tr.d2:= 0;  WindSet (handle, 3, tr);
  247.    END;
  248.    INCL (zustand, cOpen);
  249.   END; (* WITH *)
  250.   WindOpen (win, fr);
  251.  END;
  252. END OpenWindow;
  253.  
  254. PROCEDURE CloseWindow (win: sINTEGER);
  255. VAR p, v: WINDOW;
  256. BEGIN
  257.  p:= GetWindow (win, v);
  258.  IF p # NIL THEN
  259.   WITH p^ DO
  260.    IF graphics THEN
  261.     r2.x:= area.w DIV 2;  r2.y:= area.h DIV 2;  r2.w:= 0;  r2.h:= 0;
  262.     GrafShrinkbox (r2, area);
  263.    END;
  264.    EXCL (zustand, cOpen);
  265.   END;
  266.  END;
  267.  AESIntIn[0]:= win;  i:= AESCall(102, 1, 1, 0, 0);
  268. END CloseWindow;
  269.  
  270. PROCEDURE CloseWindows;
  271. VAR p: WINDOW;
  272. BEGIN
  273.  p:= windows;
  274.  WHILE p # NIL DO  CloseWindow (p^.handle); p:= p^.next; END;
  275. END CloseWindows;
  276.  
  277. PROCEDURE DeleteWindows;
  278. VAR p: WINDOW;
  279. BEGIN
  280.  p:= windows;
  281.  WHILE p # NIL DO  DeleteWindow (p^.handle); p:= p^.next; END;
  282. END DeleteWindows;
  283.  
  284. PROCEDURE OwnWindow (win: sINTEGER): BOOLEAN;
  285. VAR p: WINDOW;
  286. BEGIN
  287.  p:= windows;
  288.  WHILE p # NIL DO 
  289.   IF p^.handle = win THEN  RETURN TRUE;  END;  p:= p^.next;
  290.  END;
  291.  RETURN FALSE;
  292. END OwnWindow;
  293.  
  294. PROCEDURE WindowTop (win: sINTEGER);
  295. VAR p, v: WINDOW;
  296.     ot:   TERMINAL;
  297.     i:    sINTEGER;
  298. BEGIN
  299.  p:= GetWindow (win, v);
  300.  IF p # NIL THEN
  301.   IF NOT (cOpen IN p^.zustand) THEN  RETURN  END;
  302.   AESIntIn[0]:= p^.handle; AESIntIn[1]:= 10; i:= AESCall(105, 6, 1, 0, 0);
  303.   IF cTerminal IN p^.zustand THEN  ot:= ChangeTerminal (p^.term);  END;
  304.  END;
  305. END WindowTop;
  306.  
  307. PROCEDURE TopWindow (): sINTEGER;
  308. BEGIN
  309.  AESIntIn[0]:= 0; AESIntIn[1]:= 10; i:= AESCall(104, 2, 5, 0, 0);
  310.  RETURN AESIntOut[1];
  311. END TopWindow;
  312.  
  313. PROCEDURE WindowFulled (win: sINTEGER);
  314. VAR p, v: WINDOW;
  315.     r:    tRect;
  316. BEGIN
  317.  p:= GetWindow (win, v);
  318.  IF p = NIL THEN 
  319.   WindGet (win, WFFULLXYWH, r);
  320.   WindSet (win, WFCURRXYWH, r);
  321.  ELSE
  322.   IF NOT (cOpen IN p^.zustand) THEN  RETURN  END; 
  323.   IF cFulled IN p^.zustand THEN
  324.    WindGet (p^.handle, WFPREVXYWH, r);  EXCL (p^.zustand, cFulled);
  325.   ELSE
  326.    WindGet (p^.handle, WFFULLXYWH, r);  INCL (p^.zustand, cFulled);
  327.   END;
  328.   WITH p^ DO
  329.    WindSet (handle, WFCURRXYWH, r);
  330.    Calc (WorkRect, elements, r, area);
  331.    IF cTerminal IN zustand THEN  SetTerminal (area);  END;
  332.   END;
  333.  END;
  334. END WindowFulled;
  335.  
  336. PROCEDURE UpdateTerm (a: tRect);
  337. VAR r, c: tRect;
  338. BEGIN
  339.  WindGet (0, WFFULLXYWH, c);
  340.  SetTerminal (a);
  341.  r.x:= a.x;  r.y:= a.y;  r.w:= c.w;  r.h:= c.h;
  342.  IF ((a.x + a.w) > c.w) OR ((a.y + a.h) > c.h) THEN
  343.   ClipRect (TRUE, r);
  344.  ELSE
  345.   ClipRect (FALSE, r);
  346.  END;
  347. END UpdateTerm;
  348.  
  349. PROCEDURE WindowPos (win: sINTEGER; xx, yy: sINTEGER);
  350. VAR p, v: WINDOW;
  351.     r, c: tRect;
  352. BEGIN
  353.  p:= GetWindow (win, v);
  354.  IF p = NIL THEN
  355.   WindGet (win, WFCURRXYWH, r);  r.x:= xx;  r.y:= yy;
  356.   WindSet (win, WFCURRXYWH, r);
  357.   RETURN
  358.  ELSE
  359.   IF NOT (cOpen IN p^.zustand) THEN  RETURN  END; 
  360.   WITH p^ DO
  361.    Calc (FrameRect, elements, area, r);  r.x:= xx;  r.y:= yy;
  362.    WindSet (handle, WFCURRXYWH, r);
  363.    Calc (WorkRect, elements, r, area);
  364.    EXCL (p^.zustand, cFulled);
  365.    IF cTerminal IN zustand THEN  UpdateTerm (area);  END;
  366.   END; (* WITH *)
  367.  END;
  368. END WindowPos;
  369.  
  370. PROCEDURE WindowSize (win: sINTEGER; ww, hh: sINTEGER);
  371. VAR p, v: WINDOW;
  372.     r, c: tRect;
  373.     i, h: sINTEGER;
  374. BEGIN
  375.  p:= GetWindow (win, v);
  376.  IF p = NIL THEN
  377.   WindGet (win, WFCURRXYWH, r);  r.w:= ww;  r.h:= hh;
  378.   WindSet (win, WFCURRXYWH, r);
  379.  ELSE
  380.   IF NOT (cOpen IN p^.zustand) THEN  RETURN  END; 
  381.   WITH p^ DO
  382.    Calc (FrameRect, elements, area, r);
  383.    IF ww < minSize THEN  ww:= minSize;  END;  r.w:= ww;  
  384.    IF hh < minSize THEN  hh:= minSize;  END;  r.h:= hh;
  385.    Calc (WorkRect, elements, r, area);
  386.    IF cTerminal IN zustand THEN
  387.     area.w:= (area.w DIV CurrWidth) * CurrWidth;
  388.     area.h:= (area.h DIV CurrHeight) * CurrHeight;
  389.     Calc (FrameRect, elements, area, r);
  390.    END; 
  391.    WindSet (handle, WFCURRXYWH, r);
  392.    Calc (WorkRect, elements, r, area);
  393.    EXCL (p^.zustand, cFulled);
  394.    IF cTerminal IN zustand THEN  UpdateTerm (area);  END;
  395.   END;
  396.  END;
  397. END WindowSize;
  398.  
  399.  (*$W-*) 
  400. PROCEDURE WindowName (win: sINTEGER; REF name: ARRAY OF CHAR);
  401. VAR p, v: WINDOW;
  402. BEGIN
  403.  p:= GetWindow (win, v);
  404.  IF p = NIL THEN
  405.   tr.adr:= ADR (name);  tr.d1:= 0;  tr.d2:= 0;  WindSet (win, 2, tr);
  406.  ELSE
  407.   IF NAME IN p^.elements THEN
  408.    Assign (name, p^.name);
  409.    IF cOpen IN p^.zustand THEN
  410.     tr.adr:= ADR (p^.name);  tr.d1:= 0;  tr.d2:= 0;
  411.     WindSet (p^.handle, 2, tr);
  412.    END;
  413.   END;
  414.  END;
  415. END WindowName;
  416.  
  417. PROCEDURE WindowInfo (win: sINTEGER; REF  info: ARRAY OF CHAR);
  418. VAR p, v: WINDOW;
  419. BEGIN
  420.  p:= GetWindow (win, v);
  421.  IF p = NIL THEN
  422.   tr.adr:= ADR (info);  tr.d1:= 0;  tr.d2:= 0;  WindSet (win, 2, tr);
  423.  ELSE
  424.   IF INFO IN p^.elements THEN
  425.    Assign (info, p^.info);
  426.    IF (cOpen IN p^.zustand) THEN
  427.     tr.adr:= ADR (p^.info);  tr.d1:= 0;  tr.d2:= 0;
  428.     WindSet (p^.handle, 3, tr);
  429.    END;
  430.   END;
  431.  END;
  432. END WindowInfo;
  433.  (*$W=*) 
  434.  
  435. PROCEDURE WindowSlider (win, which, max, act, fpos: sINTEGER);
  436. VAR p, v: WINDOW;
  437.     c, d: sCARDINAL;
  438.     x, y: sINTEGER;
  439.     sv, pv: BOOLEAN;
  440. BEGIN
  441.  sv:= TRUE;  pv:= TRUE;
  442.  
  443.  (* Gr”že berechnen *)
  444.  IF max = 0 THEN
  445.   c:= 1000;
  446.  ELSE
  447.   c:= Min (1000, SHORT ((LONG (1000) * LONG (act)) DIV LONG (max) + LONG (1))); 
  448.  END;
  449.  
  450.  (* Position berechnen *)
  451.  IF (fpos = 0) OR (max < act) THEN
  452.   d:= 0;
  453.  ELSE
  454.   d:= SHORT ((LONG (1000) * LONG(fpos) + LONG (1)) DIV  LONG (max - act));
  455.  END;
  456.  
  457.  p:= GetWindow (win, v);
  458.  IF p # NIL THEN  
  459.   IF which = VSlider THEN
  460.    IF p^.vslPos = d THEN  pv:= FALSE;  ELSE  p^.vslPos:= d;  END;
  461.    IF p^.vslSize = c THEN  sv:= FALSE; ELSE  p^.vslSize:= c;  END;
  462.   ELSE
  463.    IF p^.hslPos = d THEN  pv:= FALSE;  ELSE  p^.hslPos:= d;  END;
  464.    IF p^.hslSize = c THEN  sv:= FALSE; ELSE  p^.hslSize:= c;  END;
  465.   END;
  466.  END;
  467.  
  468.  IF which = VSlider THEN  x:= 9;  y:= 16;  ELSE  x:= 8;  y:= 15;  END;
  469.  
  470.  IF pv THEN  (* Position *)
  471.   AESIntIn[0]:= win;  AESIntIn[1]:= x;  AESIntIn[2]:= d; 
  472.   i:= AESCall(105, 6, 1, 0, 0);
  473.  END;
  474.  
  475.  IF sv THEN  (* Gr”že *)
  476.   AESIntIn[0]:= win;  AESIntIn[1]:= y;  AESIntIn[2]:= c;
  477.   i:= AESCall(105, 6, 1, 0, 0);
  478.  END;
  479.  
  480. END WindowSlider;
  481.  
  482.  
  483. PROCEDURE GetElements (win: sINTEGER; VAR elements: sBITSET;
  484.                        VAR vsize, vpos, hsize, hpos: sINTEGER;
  485.                        VAR name, info: ARRAY OF CHAR);
  486. VAR p, v: WINDOW;
  487. BEGIN
  488.  p:= GetWindow (win, v);
  489.  IF p = NIL THEN
  490.   elements:= {}; vsize:= -1; vpos:= -1; hsize:= -1; hpos:= -1;
  491.   Assign ('', name);  Assign ('', info);
  492.  ELSE
  493.   elements:= p^.elements;
  494.   vsize:= p^.vslSize;
  495.   vpos:=  p^.vslPos;
  496.   hsize:= p^.hslSize;
  497.   hpos:=  p^.hslPos;
  498.   Assign (p^.name, name);
  499.   Assign (p^.info, info);
  500.  END;
  501. END GetElements;
  502.  
  503. PROCEDURE ConnectTerminal (win: sINTEGER; term: TERMINAL);
  504. VAR p, v: WINDOW;
  505. BEGIN
  506.  p:= GetWindow (win, v);
  507.  IF p = NIL THEN  RETURN  END;
  508.  INCL (p^.zustand, cTerminal);  p^.term:= term;
  509. END ConnectTerminal;
  510.  
  511. PROCEDURE WindowTerminal (win: sINTEGER): TERMINAL;
  512. VAR p, v: WINDOW;
  513. BEGIN
  514.  p:= GetWindow (win, v);
  515.  IF p # NIL THEN
  516.   IF cTerminal IN p^.zustand THEN  RETURN p^.term;  END;
  517.  END;
  518.  RETURN TERMINAL (NIL);
  519. END WindowTerminal;
  520.  
  521. PROCEDURE RectList (win: sINTEGER; flag: sINTEGER; 
  522.                     VAR rect: ARRAY OF LOC): BOOLEAN;
  523. VAR r: POINTER TO tRect;
  524.     p, v: WINDOW;
  525.     b: BOOLEAN;
  526. BEGIN
  527.  b:= FALSE;  r:= ADR (rect);
  528.  WindGet (win, flag + 11, r^);
  529.  b:= NOT ((r^.w = 0) OR (r^.h = 0));
  530.  RETURN b;
  531. END RectList;
  532.  
  533. PROCEDURE RcIntersect (VAR rc1, rc2: ARRAY OF LOC): BOOLEAN;
  534. VAR r: tRect;
  535.     p1, p2: POINTER TO tRect;
  536.     b: BOOLEAN;
  537. BEGIN
  538.  p1:= ADR(rc1);  p2:= ADR(rc2);
  539.  r.x:= Max (p2^.x, p1^.x);
  540.  r.y:= Max (p2^.y, p1^.y);
  541.  r.w:= Min (p2^.x + p2^.w, p1^.x + p1^.w);
  542.  r.h:= Min (p2^.y + p2^.h, p1^.y + p1^.h);
  543.  r.w:= r.w - r.x;
  544.  r.h:= r.h - r.y;
  545.  p2^:= r;
  546.  RETURN ((p2^.w > 0) AND (p2^.h > 0));
  547. END RcIntersect;
  548.  
  549. PROCEDURE UseGraphics   (use: BOOLEAN);
  550. BEGIN
  551.  graphics:= use;
  552. END UseGraphics;
  553.  
  554. VAR c: sCARDINAL;
  555.  
  556. BEGIN
  557.  mtAppl.InstallTermproc (DeleteWindows);
  558.  windows:= NIL;
  559.  minSize:= 5 * mtAppl.BoxHeight;
  560.  graphics:= TRUE;
  561.  in2:= ADR(AESIntIn[2]);
  562. END mtWindows.
  563.  
  564.